#ifndef CUBA_H_
#define CUBA_H_

#include "Bloque.h"
#include "Registro.h"
#include "DatoCuba.h"

namespace Toolkit
{
class IndiceHashExtensible;

class Cuba: public Bloque
{

public:
	Cuba(const unsigned long int &tamanoBloque, const TipoSerializacion&);

	virtual ~Cuba();

    /**
     * Reduce el atributo profundidad en 1 y combina las claves/referencias de dos cubas en una.
     * Devuelve true si se lograron combinar, false en caso contrario.
     */
    bool combinar(Cuba &cuba);

    unsigned int getProfundidad() const;

    void setProfundidad(const unsigned int &profundidad);

    void incrementarProfundidad();

    void decrementarProfundidad();

    void agregar (Registro *);

    virtual char getTipo() const;

    DatoCuba* getDatoCualquiera() const;

    bool puedeAgregar(const Dato& dato) const;

    /**
     * Aumenta el atributo profundidad en 1 y separa la cuba actual en dos Cubas. Aquellas
     * claves en las cuales el bit en la posicion profundidad valga 0, se quedan en la actual cuba,
     * el resto de las claves con sus respectivas referencias van a la nueva Cuba.
     */
    Cuba* dividir(const IndiceHashExtensible &indiceHash);

    using Bloque::agregar;

    virtual Componente *clonar() const;

protected:
    virtual string especializarSerializacion() const;
    virtual void especializarHidratacion(stringstream&);

private:

	void transferirElementosSinVerif(Cuba &cuba);

	/**
	 * Indica la cantidad de bits necesarios para ser referenciado por el Directorio.
	 */
	unsigned int profundidad;
};

}

#endif /* CUBA_H_ */
